﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using ServicioRFIDMovil.Entidad;
using ServicioRFIDMovil.DataAccess;
using ServicioRFIDMovil.Herramientas;
using System.Data;

namespace ServicioRFIDMovil.Datos
{
    public class DetalleBienSolicitudDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(DetalleBienSolicitudDA));

        private const string FORMATO_BUSQUEDA = "{0}='{1}'";

        // Parametros Entradas
        private const string PARAM_CURSOR = "P_LISTADETALLESOLICITUD";
        private const string PARAM_COD_SOLICITUD = "P_IIDSOLICITUD";


        // Parametros Salida

        private const string VCODEPC = "VCODEPC";
        private const string IIDBIEN = "IIDBIEN";
        private const string VDESCRIPCION = "VDESCRIPCION";
        private const string VCODBARRA = "VCODBARRA";
        private const string IIDBIENSITUACION = "IIDBIENSITUACION";
        private const string IIDBIENESTADO = "IIDBIENESTADO";
        private const string IIDESTADOPRESTAMO = "IIDESTADOPRESTAMO";


        #endregion

        #region --- Metodos Propios ---

        // Listar detalle de solicitud salida, bien con estado "Separado"
        public ListaDetalleBienSolicitud obtenerSolicitudSalida(Solicitud solicitud)
        {
            ListaDetalleBienSolicitud listaDetalleSolicitud = null;
            DataSet dsBienAlmacen = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("obtenerSolicitudSalida()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                db.NombreProcedimiento = Constantes.PROCEDIMIENTO_RFID_OBTENERDETALLESOLICITUDSALIDA;
                db.agregarParametro(PARAM_COD_SOLICITUD, DbType.Int32, ParameterDirection.Input, solicitud.codSolicitud);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsBienAlmacen);

                listaDetalleSolicitud = new ListaDetalleBienSolicitud();

                foreach (DataRow fila in dsBienAlmacen.Tables[0].Rows)
                {
                    listaDetalleSolicitud.Add(generarEntidad(fila));
                }
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Retornando " + listaDetalleSolicitud.Count + " registros");
            }

            return listaDetalleSolicitud;
        }

        // Listar detalle de solicitud entrada, bien con estado "En uso"
        public ListaDetalleBienSolicitud obtenerSolicitudEntrada(Solicitud solicitud)
        {
            ListaDetalleBienSolicitud listaDetalleSolicitud = null;
            DataSet dsBienAlmacen = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("obtenerSolicitudSalidaEntrada()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                db.NombreProcedimiento = Constantes.PROCEDIMIENTO_RFID_OBTENERDETALLESOLICITUDENTRADA;
                db.agregarParametro(PARAM_COD_SOLICITUD, DbType.Int32, ParameterDirection.Input, solicitud.codSolicitud);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsBienAlmacen);

                listaDetalleSolicitud = new ListaDetalleBienSolicitud();

                foreach (DataRow fila in dsBienAlmacen.Tables[0].Rows)
                {
                    listaDetalleSolicitud.Add(generarEntidad(fila));
                }
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Retornando " + listaDetalleSolicitud.Count + " registros");
            }

            return listaDetalleSolicitud;
        }

        private DetalleBienSolicitud generarEntidad(DataRow fila)
        {
            DetalleBienSolicitud detalleBienSolicitud = new DetalleBienSolicitud();
            detalleBienSolicitud.etiqueta = new Etiqueta();
            detalleBienSolicitud.etiqueta.epc = fila[VCODEPC].ToString();

            detalleBienSolicitud.etiqueta.bien = new Bien();
            detalleBienSolicitud.etiqueta.bien.idBien = Convert.ToInt32(fila[IIDBIEN]);
            detalleBienSolicitud.etiqueta.bien.descripcion = fila[VDESCRIPCION].ToString();
            detalleBienSolicitud.etiqueta.bien.codBarra = fila[VCODBARRA].ToString();
            detalleBienSolicitud.etiqueta.bien.codBienSituacion = Convert.ToInt32(fila[IIDBIENSITUACION]);
            detalleBienSolicitud.etiqueta.bien.codBienEstado = Convert.ToInt32(fila[IIDBIENESTADO]);
            detalleBienSolicitud.etiqueta.bien.codBienPrestamo = Convert.ToInt32(fila[IIDESTADOPRESTAMO]);

            return detalleBienSolicitud;

        }
        #endregion
    }
}
